package com.shujia.data_safe;

public class VisibilityDemo extends Thread {

    // volatile 可以保证属性的可见性
     boolean flag = true;

    /*
    原子性可以解决可见性问题
     */
    @Override
    public void run() {

        /*
        while 死循环, 不会刷新工作内存里面的值
        只有重新冲主内存读取最新的值, 才能够跳出while
         */
        while (flag) {
            /*
            尝试加锁, 时间片到了,会触发线程切换
            cpu切换到其他的线程, 最终还是要切换回来
            工作内存是有限的, 切换的时候会清空工作内存的部分值
            切换回来会从主内存读取flag, 读取到的就是其他线程修改之后的值
             */
//            synchronized (this) {
//            }
            System.out.println(1);
        }

        System.out.println("方法执行完毕!");
    }


    public static void main(String[] args) throws InterruptedException {
        VisibilityDemo thread = new VisibilityDemo();
        thread.start();

        Thread.sleep(1000);

        // 最多只是修了主内存的值
        thread.flag = false;


    }
}
